﻿using System;
using System.Linq;
using System.Text;
using Spring.Data.Core;
using System.Data;
using System.Collections;
using Spring.Data;
using Spring.Data.Common;
using GestionadorBaseDatos;
using CRUD.InterfaceDAO;
namespace CRUD.DAO
{
    /// <summary>
    /// Clase encargada de interactuar con la tabla PAGO del modelo
    /// </summary>
    public class PagoDao : AdoDaoSupport, IDaoPago
    {

        #region Querys para metodos
        private string sqlByPago = "select nicknamePago,idFormaPago,montoMaximo,status from pago where idFormaPago = @idFormaPago and nicknamePago =@nicknamePago";
        private string sqlPagosByUsuario = "select p.nicknamePago, p.idFormaPago, p.montoMaximo, p.status from pago p" + " " +
                                            "where p.nicknamePago = @nicknamePago";
        private string sqlGetAll = "select nicknamePago,idFormaPago,montoMaximo,status from pago";
        private string sqlInsert = "INSERT INTO pago (nicknamePago,idFormaPago,montoMaximo,status ) VALUES (@nicknamePago,@idFormaPago,@montoMaximo,@status)";
        private string sqlPagosByFormasPago = "select p.nicknamePago, p.idFormaPago, p.montoMaximo, p.status from pago p, forma_pago fp" + " " +
                                              "where p.idFormaPago = @idFormaPago and p.idFormaPago = fp.idFormaPago";
        private string sqlUpdate = "update pago set montoMaximo = @montoMaximo, status = @status where nicknamePago = @nicknamePago and idFormaPago = @idFormaPago";
       
        # endregion

        # region metodos

        public virtual IList GetAll()
        {
            IList lista = AdoTemplate.QueryWithRowMapperDelegate(CommandType.Text, sqlGetAll,
                delegate(IDataReader iDataReader, int rowNum)
                {
                    Pago pago = new Pago();
                    Usuario u = new Usuario();
                    FormaPago formaPago = new FormaPago();
                    u.Nickname = iDataReader.GetString(0);
                    pago.UsuarioAsociado = u;
                    formaPago.IdFormaPago = iDataReader.GetInt32(1);
                    pago.FormaPagoAsociado = formaPago;
                    pago.MontoMaximo = iDataReader.GetInt32(2);
                    pago.Estatus = iDataReader.GetString(3);
                    return pago;
                });

            return lista;
        }

        public void Update(Pago pago)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();

            dbParameters.Add("@nicknamePago", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = pago.UsuarioAsociado.Nickname;
            dbParameters.Add("@idFormaPago", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = pago.FormaPagoAsociado.IdFormaPago;
            dbParameters.Add("@montoMaximo", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = pago.MontoMaximo;
            dbParameters.Add("@status", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = pago.Estatus;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlUpdate, dbParameters);

        }

        public void Insert(Pago crear)
        {

            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();

            dbParameters.Add("@nicknamePago", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.UsuarioAsociado.Nickname;
            dbParameters.Add("@idFormaPago", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.FormaPagoAsociado.IdFormaPago;
            dbParameters.Add("@montoMaximo", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.MontoMaximo;
            dbParameters.Add("@status", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Estatus;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlInsert, dbParameters);


        }

        /*
        public Usuario GetById(string Nickname)
       {
            return (FormaPago)AdoTemplate.QueryForObject(CommandType.Text, SQL, new FormaPagoRowMapper(), "@descripcion", DbType.String, 30, Descripcion);
        }
        */
        public IList GetPagosByUsuario(Usuario usuario)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();

            dbParameters.Add("@nicknamePago", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = usuario.Nickname;

            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlPagosByUsuario, new PagoRowMapper(), dbParameters);
        }
       
        public IList GetPagosByFormaPago(FormaPago formaPago)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();

            dbParameters.Add("@idFormaPago", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = formaPago.IdFormaPago;

            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlPagosByFormasPago, new PagoRowMapper(), dbParameters);
        }
        public Pago GetPagosByUserAndId(Pago formaPago)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@nicknamePago", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = formaPago.UsuarioAsociado.Nickname;
            dbParameters.Add("@idFormaPago", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = formaPago.FormaPagoAsociado.IdFormaPago;

            return (Pago)AdoTemplate.QueryForObject(CommandType.Text, sqlByPago, new PagoRowMapper(), dbParameters);
        }




      

        # endregion
    }
}
